﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using DigitalSolutionLibrary.SqlDatabase;
using DigitalSolutionLibrary.Utilities;

namespace DigitalSolutionManagement
{
    public partial class frmEditDeliveryVoucher : BaseFormEdit
    {
        private OpenMode openMode;
        private Thread th;
        private DataTable dtProduct;
        private DataTable dtStock;
        private long totalMoney;

        #region prepare form
        private void PrepareForm()
        {
            ParameterStock stock = new ParameterStock();
            Parameter par = new Parameter("type", 1, SqlDbType.Int);
            stock.AddParamter(par);

            object obj = Program.dbWrapper.ExecuteStore("GetAllProductList", stock, DatabaseWrapper.ReturnType.DATASET);
            if (obj != null)
            {
                dtStock = ((DataSet)obj).Tables[0];
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                btnOK.Enabled = false;
                return;
            }
            
            if (openMode == OpenMode.NEW)
            {
                //gen delivery number
                stock = new ParameterStock();
                par = new Parameter("type", 4, SqlDbType.Int);
                stock.AddParamter(par);
                obj = Program.dbWrapper.ExecuteStore("GenerateCode", stock, DatabaseWrapper.ReturnType.FIRST_CELL);
                if (obj != null)
                {
                    txtNo.Text = obj.ToString();

                    dtProduct = new DataTable("Product");
                    dtProduct.Columns.Add("No", typeof(int));
                    dtProduct.Columns.Add("ProId", typeof(int));
                    dtProduct.Columns.Add("ProName", typeof(string));
                    dtProduct.Columns.Add("ProCode", typeof(string));
                    dtProduct.Columns.Add("ProUnit", typeof(string));
                    dtProduct.Columns.Add("RequestQty", typeof(int));
                    dtProduct.Columns.Add("RealQty", typeof(int));
                    dtProduct.Columns.Add("Price", typeof(decimal));
                    dtProduct.Columns.Add("Money", typeof(decimal));
                    modifiedDataGridView1.DataSource = dtProduct;

                    processing1.HideProcessing();
                    btnDel.Enabled = false;
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    btnOK.Enabled = false;
                }
            }
            else
            {
                stock = new ParameterStock();
                par = new Parameter("No", ItemId, SqlDbType.Int);
                stock.AddParamter(par);
                obj = Program.dbWrapper.ExecuteStore("GetDeliveryVoucher", stock, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet ds = (DataSet)obj;
                    ds.DataSetName = "Root";
                    txtDate.Value = (DateTime)ds.Tables[0].Rows[0]["Date"];
                    txtName.Text = ds.Tables[0].Rows[0]["FullName"].ToString();
                    txtNo.Text = "0" + ds.Tables[0].Rows[0]["No"].ToString();
                    txtAdd.Text = ds.Tables[0].Rows[0]["Address"].ToString();
                    txtReason.Text = ds.Tables[0].Rows[0]["Reason"].ToString();

                    dtProduct = ds.Tables[1];
                    dtProduct.TableName = "Product";
                    modifiedDataGridView1.DataSource = dtProduct;
                    UpdateTotalMoney();
                    processing1.HideProcessing();
                    btnDel.Enabled = modifiedDataGridView1.SelectedRows.Count > 0;
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    btnOK.Enabled = false;
                }
            }
        }
        #endregion

        #region update total money
        private void UpdateTotalMoney()
        {
            totalMoney = 0;
            foreach (DataRow row in dtProduct.Rows)
            {
                totalMoney += Convert.ToInt32(row["Money"]);
            }
            lblTotalMoney.Text = "Tổng thành tiền: " + totalMoney.ToString("N0");
            lblTextMoney.Text = "(" + Utility.ReadMoney(totalMoney) + ")";
        }
        #endregion

        #region Ok press
        private void OkPress()
        {
            ParameterStock stock = new ParameterStock();
            Parameter par = new Parameter("No", txtNo.Text, SqlDbType.Int);
            stock.AddParamter(par);

            par = new Parameter("Date", txtDate.Value, SqlDbType.Date);
            stock.AddParamter(par);

            par = new Parameter("FullName", txtName.Text, SqlDbType.NVarChar, 100);
            stock.AddParamter(par);

            par = new Parameter("TotalMoney", totalMoney, SqlDbType.Decimal);
            stock.AddParamter(par);

            par = new Parameter("EmpId", Program.EmpId, SqlDbType.Int);
            stock.AddParamter(par);

            par = new Parameter("XmlProduct", Utility.DataTableToXml(dtProduct), SqlDbType.Xml);
            stock.AddParamter(par);

            par = new Parameter("Addr", txtAdd.Text, SqlDbType.NVarChar, 200);
            stock.AddParamter(par);

            par = new Parameter("Reason", txtReason.Text, SqlDbType.NVarChar, 200);
            stock.AddParamter(par);

            par = new Parameter("Message", null, SqlDbType.NVarChar, ParameterDirection.Output, 200);
            stock.AddParamter(par);

            object obj = Program.dbWrapper.ExecuteStore(openMode == OpenMode.NEW ? "AddDeliveryVoucher" : "EditDeliveryVoucher", stock, DatabaseWrapper.ReturnType.FIRST_CELL);
            if (obj != null)
            {
                if ((int)obj > 0)
                {
                    RefreshList("frmListDelivery");
                    DialogResult = System.Windows.Forms.DialogResult.Cancel;
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show(stock.GetAtPosition(6).ValueOut.ToString(), "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

        public override BaseFormEdit GetNewInstance(BaseFormEdit.OpenMode mode)
        {
            return new frmEditDeliveryVoucher(mode);
        }

        public frmEditDeliveryVoucher()
        {
        }

        public frmEditDeliveryVoucher(OpenMode mode)
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            openMode = mode;

            if (openMode == OpenMode.EDIT)
            {
                btnOK.Text = "Lưu";
                btnOK.Type = DigitalSolutionControls.IconButton.ButtonType.SAVE;
                this.Text = formHeader1.Title = "Chỉnh sửa phiếu nhập kho";
            }
        }

        private void frmEditDeliveryVoucher_Load(object sender, EventArgs e)
        {
            processing1.ShowProcessing();
            th = new Thread(() => PrepareForm());
            th.Start();
        }

        private void frmEditDeliveryVoucher_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (th != null && th.IsAlive)
                th.Abort();
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            frmChoiceProduct frmChoice = new frmChoiceProduct(1);
            frmChoice.ActionType = 1;
            if (frmChoice.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                foreach (DataRow row in dtProduct.Rows)
                {
                    if ((int)row["ProId"] == frmChoice.ProId)
                    {
                        row["RealQty"] = (int)row["RealQty"] + 1;
                        row["Money"] = (int)row["RealQty"] * (decimal)row["Price"];
                        UpdateTotalMoney();
                        return;
                    }
                }
                int no = dtProduct.Rows.Count;
                no += 1;
                dtProduct.Rows.Add(no, frmChoice.ProId, frmChoice.ProName, frmChoice.ProCode, frmChoice.UnitName, 1, 1, frmChoice.ProPrice, frmChoice.ProPrice);
                UpdateTotalMoney();
                btnDel.Enabled = modifiedDataGridView1.SelectedRows.Count > 0;
            }
        }

        private void btnDel_Click(object sender, EventArgs e)
        {
            dtProduct.Rows.RemoveAt(modifiedDataGridView1.SelectedRows[0].Index);
            btnDel.Enabled = modifiedDataGridView1.SelectedRows.Count > 0;
            UpdateTotalMoney();
            int no = 1;
            foreach (DataRow row in dtProduct.Rows)
            {
                row["No"] = no;
                no++;
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            DialogResult = System.Windows.Forms.DialogResult.Cancel;
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            if (txtDate.Empty)
            {
                MessageBox.Show("Vui lòng nhập ngày lập phiếu", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (!txtDate.IsValidDate())
            {
                MessageBox.Show("Ngày lập phiếu không đúng, vui lòng kiểm tra lại", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (txtName.Text == String.Empty)
            {
                MessageBox.Show("Vui lòng nhập tên người nhận hàng", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtName.Focus();
                return;
            }
            if (txtAdd.Text == String.Empty)
            {
                MessageBox.Show("Vui lòng nhập địa chỉ người nhận hàng", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtAdd.Focus();
                return;
            }
            if (txtReason.Text == String.Empty)
            {
                MessageBox.Show("Vui lòng nhập lý do xuất hàng", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtReason.Focus();
                return;
            }
            if (dtProduct.Rows.Count == 0)
            {
                MessageBox.Show("Chưa có sản phẩm trong phiếu xuất kho", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            foreach (DataRow row in dtProduct.Rows)
            {
                foreach (DataRow r in dtStock.Rows)
                {
                    if (row["ProId"].ToString() == r["ProId"].ToString() && (int)row["RealQty"] > (int)r["Qty"])
                    {
                        MessageBox.Show(row["ProName"]+" không còn đủ số lượng để xuất kho", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
            }

            processing1.ShowProcessing();
            th = new Thread(() => OkPress());
            th.Start();
        }

        private void modifiedDataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (modifiedDataGridView1.Columns[e.ColumnIndex].ReadOnly)
                return;

            int val;
            if (Int32.TryParse(e.FormattedValue.ToString(), out val))
            {
                if (val <= 0 || val > 999)
                {
                    MessageBox.Show("Dữ liệu nhập vào không đúng, vui lòng kiểm tra lại", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    e.Cancel = true;
                }
            }
            else
            {
                MessageBox.Show("Dữ liệu nhập vào không đúng, vui lòng kiểm tra lại", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                e.Cancel = true;
            }
        }

        private void modifiedDataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 6)
            {
                dtProduct.Rows[e.RowIndex]["Money"] = (int)dtProduct.Rows[e.RowIndex]["RealQty"] * (decimal)dtProduct.Rows[e.RowIndex]["Price"];
                UpdateTotalMoney();
                modifiedDataGridView1.Refresh();
            }
        }
    }
}
